package com.neutech.maplestory.entity;

import com.neutech.maplestory.constant.Constant;
import com.neutech.maplestory.util.ImageUtil;

import java.awt.*;
import java.awt.event.KeyEvent;

/**
 * @Description: TODO(这里用一句话描述这个类的作用)
 * @Author ${秦}
 * @Date 2021/1/27 17:58
 */
public class Hero extends AbstractMapleStoryObject{
    public static Image[] imgs = new Image[100];
    static {
        for (int i = 0; i < 4; i++) {
            imgs[i] = ImageUtil.getImage("hero_right_stand" + i);
        }
        for (int i = 4; i < 8; i++) {
            imgs[i] = ImageUtil.getImage("hero_left_stand" + (i - 4));
        }
        for (int i = 8; i < 13; i++) {
            imgs[i] = ImageUtil.getImage("hero_right_walk" + (i - 8));
        }
        for (int i = 13; i < 18; i++) {
            imgs[i] = ImageUtil.getImage("hero_left_walk" + (i - 13));
        }
        imgs[18] = ImageUtil.getImage("hero_right_prone");
        imgs[19] = ImageUtil.getImage("hero_left_prone");
        imgs[20] = ImageUtil.getImage("hero_right_jump");
        imgs[21] = ImageUtil.getImage("hero_left_jump");

    }
    public Hero(){}

    public Hero(int x,int y){
        this.x = x;
        this.y = y;
        this.speed= Constant.HERO_SPEED;
        this.width = imgs[0].getWidth(null);
        this.height = imgs[0].getHeight(null);
        this.dir = Direction.RIGHT;
        this.action = Action.STAND;

    }
    /*
    * 一直加的计算器
    * */
    private int count = 0;

    /*
    * 计算当前画几张图
    * */
    private int step = 0;
/*
* 左右的开关
* */
    public boolean left,right,down,jump;
    @Override
    public void draw(Graphics g) {
        switch (dir) {

            case RIGHT:
                switch (action) {
                    case STAND:
                        //right stand
                        if (count++ % 3 == 0) {
                            g.drawImage(imgs[(step++ % 4)], x, y, null);
                        } else {
                            g.drawImage(imgs[step % 4], x, y, null);
                        }
                        break;
                    case WALK:
                        if (count++ % 3 == 0) {
                            g.drawImage(imgs[(step++ % 5) + 8], x, y, null);
                        } else {
                            g.drawImage(imgs[step % 5 + 8], x, y, null);
                        }
                        break;
                    case PRONE:
                        g.drawImage(imgs[18],x + 10,y + 33,null );
                        break;
                    case JUMP:
                        g.drawImage(imgs[20],x ,y ,null );
                        break;
                    default:
                        break;
                }
                break;
            case LEFT:
                switch (action) {
                    case STAND:
                        //left stand
                        if (count++ % 3 == 0) {
                            g.drawImage(imgs[(step++ % 4) + 4], x, y, null);
                        } else {
                            g.drawImage(imgs[step % 4 + 4], x, y, null);
                        }
                        break;
                    case WALK:
                        //left walk
                        if (count++ % 3 == 0) {
                            g.drawImage(imgs[(step++ % 5) + 13], x, y, null);
                        } else {
                            g.drawImage(imgs[step % 5 + 13], x, y, null);
                        }
                        break;
                    case PRONE:
                        g.drawImage(imgs[19],x - 10,y + 33,null );
                        break;
                    case JUMP:
                        g.drawImage(imgs[21],x ,y ,null );
                        break;
                    default:
                        break;
                }
                break;
            default:
                break;
        }



        move();
    }




    @Override
    public void move() {
         if(left){
             x -= speed;
             this.action = Action.WALK;
         }
         if(right){
             x += speed;
             this.action = Action.WALK;
         }
         if(jump){
             jump();

         }

         confirmStatus();
    }
    private double v0 = Constant.INIT_JUMP_SPEED;
    private double vt;
    private double g = 9.8;
    private double delta_height;
    private double t = 0.8;
/*
* 跳跃的方法
* */
    private void jump() {
        //竖直上抛，自由落体
        vt = v0 - g * t;
        delta_height = v0 * t;
        v0 = vt;
        y -= delta_height;
        //自由落体结束位置
        if(y >= 500){
            jump = false;
            v0 = Constant.INIT_JUMP_SPEED;
            vt = 0.0;
            y = 500;
        }
    }

    /*
* 根据当前人物的左右方向，确定人物方向
* */
    private void confirmStatus(){
        if(left && !right){
            this.dir = Direction.LEFT;
            if(jump){
                this.action = Action.JUMP;
            }
        }else if(right && !left){
            this.dir = Direction.RIGHT;
            if(jump){
                this.action = Action.JUMP;
            }
        }else if(down){
            this.action = Action.PRONE;
        }else if(jump){
            this.action = Action.JUMP;
        }
        //都按下或者都不按下
        else{
            this.action = Action.STAND;
        }

    }
    /*
    * 按键的方法
    * */
    public void keyPressed(KeyEvent e){
        switch(e.getKeyCode()){
            case KeyEvent.VK_A:
                left = true;
                break;
            case KeyEvent.VK_D:
                right = true;
                break;
            case KeyEvent.VK_S:
                down = true;
                break;
            case KeyEvent.VK_K://跳跃
                jump = true;
                break;
            default:
                break;
        }
    }
/*
* 释放键的方法
* */
    public void keyReleased(KeyEvent e){
        switch(e.getKeyCode()){
            case KeyEvent.VK_A:
                left = false;
                break;
            case KeyEvent.VK_D:
                right = false;
                break;
            case KeyEvent.VK_S:
                down = false;
                break;
            case KeyEvent.VK_K:
                jump = false;
                break;
            default:
                break;
        }
    }


}
